/*************************************************************************/
/*                                                                       */
/*  Copyright (c) 1994 Stanford University                               */
/*                                                                       */
/*  All rights reserved.                                                 */
/*                                                                       */
/*  Permission is given to use, copy, and modify this software for any   */
/*  non-commercial purpose as long as this copyright notice is not       */
/*  removed.  All other uses, including redistribution in whole or in    */
/*  part, are forbidden without prior written permission.                */
/*                                                                       */
/*  This software is provided with absolutely no warranty and no         */
/*  support.                                                             */
/*                                                                       */
/*************************************************************************/

/* does the arakawa jacobian calculation (of the x and y matrices, 
   putting the results in the z matrix) for a subblock. */

#include <stdio.h>
#include <math.h>
#include <time.h>
#include "decs.h"

void jacobcalc(x,y,z,pid,firstrow,lastrow,firstcol,lastcol,numrows,numcols) 

double x[IMAX][JMAX];
double y[IMAX][JMAX];
double z[IMAX][JMAX];
int pid;
int firstrow,lastrow,firstcol,lastcol,numrows,numcols;

{
   double f1;
   double f2;
   double f3;
   double f4;
   double f5;
   double f6;
   double f7;
   double f8;
   int iindex;
   int indexp1;
   int indexm1;
   int im1;
   int ip1;
   int i;
   int j;

   if (pid == MASTER) {
     z[0][0]=0.0;
   }
   if (pid == nprocs-xprocs) {
     z[im-1][0]=0.0;
   }
   if (pid == xprocs-1) {
     z[0][jm-1]=0.0;
   }
   if (pid == nprocs-1) {
     z[im-1][jm-1]=0.0;
   }
   for (iindex=firstcol;iindex<=lastcol;iindex++) {
     indexp1 = iindex+1;
     indexm1 = iindex-1;
     for (i=firstrow;i<=lastrow;i++) {
       ip1 = i+1;
       im1 = i-1;
       f1 = (y[i][indexm1]+y[ip1][indexm1]-y[i][indexp1]-y[ip1][indexp1])*
            (x[ip1][iindex]-x[i][iindex]);
       f2 = (y[im1][indexm1]+y[i][indexm1]-y[im1][indexp1]-y[i][indexp1])*
            (x[i][iindex]-x[im1][iindex]);
       f3 = (y[ip1][iindex]+y[ip1][indexp1]-y[im1][iindex]-y[im1][indexp1])*
            (x[i][indexp1]-x[i][iindex]);
       f4 = (y[ip1][indexm1]+y[ip1][iindex]-y[im1][indexm1]-y[im1][iindex])*
            (x[i][iindex]-x[i][indexm1]);
       f5 = (y[ip1][iindex]-y[i][indexp1])*(x[ip1][indexp1]-x[i][iindex]);
       f6 = (y[i][indexm1]-y[im1][iindex])*(x[i][iindex]-x[im1][indexm1]);
       f7 = (y[i][indexp1]-y[im1][iindex])*(x[im1][indexp1]-x[i][iindex]);
       f8 = (y[ip1][iindex]-y[i][indexm1])*(x[i][iindex]-x[ip1][indexm1]);
 
       z[i][iindex] = factjacob*(f1+f2+f3+f4+f5+f6+f7+f8);
     }
   }
   if (firstrow == 1) {
     for (j=firstcol;j<=lastcol;j++) {
       z[0][j] = 0.0;
     }
   }
   if ((firstrow+numrows) == im-1) {
     for (j=firstcol;j<=lastcol;j++) {
       z[im-1][j] = 0.0;
     }
   }
   if (firstcol == 1) {
     for (j=firstrow;j<=lastrow;j++) {
       z[j][0] = 0.0;
     }
   }
   if ((firstcol+numcols) == jm-1) {
     for (j=firstrow;j<=lastrow;j++) {
       z[j][jm-1] = 0.0;
     }
   }
}

